from django.shortcuts import render
from django.views import View
from apps.areas.models import Areas
from django.http import JsonResponse

from meiduo_mall.settings.dev import logger
from utils.response_code import RETCODE
from django.core.cache import cache
import json
class AreasView(View):
    """
    省市区三级联动,没有parents_id的就是省级地区
    parent_id = id的就是市区级地区,避免大量数据的访问,设置缓存.
    """
    def get(self,request):
        areas_id = request.GET.get("area_id")
        # 如果parent_id不存在是省级地区
        if areas_id is None:
            # 读取缓存
            province_list1 = cache.get('province_list1')
            # 如果缓存失效
            if not province_list1:
                try:
                    province = Areas.objects.filter(parent__isnull=True)
                    province_list1 = []
                    # 这里注意下,直接遍历后province_element的数据类型是apps.areas.modelos.Areas这个模板的类型
                    for province_element in province:
                        # 通过获取到的单个元素.id和.name的方法获取到它的属性值
                        province_list1.append({"id":province_element.id,"name":province_element.name})
                except Exception as f:
                    logger.error(f)
                    JsonResponse({"code": RETCODE.DBERR,"errmsg": "DBERR"})
                # 设置缓存
                cache.set('province_list1', province_list1, 600)
            return JsonResponse({
                "code": RETCODE.OK,
                "errmsg": "OK",
                "province_list": province_list1
                })
        else:
            """
            每点击一下表单都会有一个area_id发送进来,所以选择完省后发送进来areaid
            这里的areaid针对的使市,选择完市后发送进来areaid,根据市的areaid选择县
            """
            # 如果是读取缓存需要有一个变量去接受,要不然输出时不好交给前端,这个变量的类型使bool
            sub_data = cache.get('sub_data:%s'% areas_id)
            if not sub_data:
            # 如果选择filter过滤的话返回的是一个quertyset类型不能用related_name直接查询
            # 这是一查多方式
                city = Areas.objects.get(id__exact=areas_id)
                city_ob = city.subs.all()
                try :
                    city_list = []
                    for city_element in city_ob:
                        city_list.append({"id":city_element.id,"name":city_element.name})
                    sub_data = {"subs": city_list}
                except Exception as f:
                    logger.error(f)
                    return JsonResponse({"code": RETCODE.DBERR,"ermesg": "DBERR"})

                cache.set('sub_data:%s'% areas_id,sub_data,600)
            return JsonResponse({
                "code": RETCODE.OK,
                "ermesg": "OK",
                "sub_data": sub_data
            })
